package com.example.musicplayer;

import android.annotation.SuppressLint;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.SeekBar;
import android.widget.TextView;
import android.widget.Toast;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import java.io.IOException;
import java.util.List;


public class PlayActivity extends AppCompatActivity implements View.OnClickListener {
    private static final String TAG="PlayActivity";
    Button nextIv,lastIv,back_btn;  //下一首 返回  上一首
    ImageView albumIv,playIv;       //专辑  开始/暂停图片按钮
    TextView singerTv,songTv,total_tv,current_tv;  //歌手 歌名 总时长 当前时长
    SeekBar duration_sb,volume;                           //可拉进度条
    //volume=findViewById(R.id.volume_seekbar);

    Thread updateSb;                               //线程
    MediaPlayer mediaPlayer;
    List <MusicBean> mDatas; //    数据源
    int play_position = -1;//    记录当前正在播放的音乐的位置
    int pause_SeekBar = 0; //    记录暂停音乐时进度条的位置
    private boolean sb_pause = false;//判断进度条是否正在被拖动
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.player_layout);
        //隐藏顶部的标题栏
        ActionBar actionBar=getSupportActionBar();
        if(actionBar !=null){
            actionBar.hide();
        }
        volume=findViewById(R.id.volume_seekbar);

        initView();         // 初始化控件的函数
        mediaPlayer = new MediaPlayer();    //初始化MediaPlayer
        initData();

        //播放完成进入下一首
        mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mediaPlayer) {
                Log.i(TAG, "onCompletion: 播放完成进入下一首");
                Log.i(TAG, "onCompletion: **"+play_position);
                Log.i(TAG, "onCompletion: *****"+duration_sb.getProgress());
                nextIv.performClick();

            }
        });
        //增加错误监听器，解决了切歌会连续回调setOnCompletionListener
        mediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {
            @Override
            public boolean onError(MediaPlayer mp, int what, int extra) {
                return true;
            }
        });
    }
    //当前销毁后，不在播放音乐
    protected void onDestroy() {
        super.onDestroy();
        /* 停止音乐的函数*/
        stopMusic();
    }


    private void initData() {
        Intent intent = getIntent();
        mDatas = (List<MusicBean>) intent.getSerializableExtra("mDatas");
        play_position = (int) intent.getSerializableExtra("Position");    //得到当前位置
        MusicBean musicBean = mDatas.get(play_position); //根据当前位置，获取歌曲信息
        playMusicInMusicBean(musicBean);
    }

    public void playMusicInMusicBean(MusicBean musicBean) {
        /*根据传入对象播放音乐*/
        //设置显示的歌手名称和歌曲名
        singerTv.setText(musicBean.getSinger());
        songTv.setText(musicBean.getSong());
        total_tv.setText(musicBean.getDuration());
        Bitmap bm = BitmapFactory.decodeFile(musicBean.getAlbumArt());
        albumIv.setImageBitmap(bm);
        stopMusic();    //先暂停在播放
        mediaPlayer.reset();    // 重置多媒体播放器，改变地址（删除原来地址）
//                设置新的播放路径
        try {
            mediaPlayer.setDataSource(musicBean.getPath()); //得到新的路径
            playMusic();
        } catch (IOException e) {
            e.printStackTrace();
        }
        CreateThread();
        ProgressBarChanged();
    }

    private void CreateThread() {
        //创建一个新线程实现进度条实时更新
        updateSb = new Thread(){
            @Override
            public void run() {
                int total = mediaPlayer.getDuration();          //歌曲时长
                //先获取position并设置保证重新打开播放器若继续播放时进度条瞬间到位
                int currPos = mediaPlayer.getCurrentPosition();//得到当前播放位置
                duration_sb.setProgress(currPos);       //设置SeekBar当前的数值
                while(currPos < total){     //当前播放位置小于音乐时时长时
                    try {
                        //若进度条正在被拖动则进度不会乱动
                        if (sb_pause){
                            sleep(500);
                        }else {
                            sleep(500);
                            currPos = mediaPlayer.getCurrentPosition();
                            duration_sb.setProgress(currPos);
                        }
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        };
        duration_sb.setMax(mediaPlayer.getDuration());  //设置进度条最大值
        updateSb.start();
    }

    private void ProgressBarChanged() {
        //实现音量调节
        final AudioManager am = (AudioManager) getSystemService(AUDIO_SERVICE);

        int max = am.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
        int cur = am.getStreamVolume(AudioManager.STREAM_MUSIC);
        volume.setMax(max);
        volume.setProgress(cur);
        volume.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                am.setStreamVolume(AudioManager.STREAM_MUSIC, progress, AudioManager.FLAG_PLAY_SOUND);
            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {

            }

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {

            }
        });

        //实现拖动进度条调整歌曲进度
        duration_sb.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            //进度条进度改变的时候调用
            public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
                //保证播放时间显示随进度条拖动而改变
                String curTime = getCurTime(seekBar.getProgress()); //获取SeekBar当前位置,调用getCurTime(),转换时间格式
                current_tv.setText(curTime);    //在控件上显示
            }

            @Override
            //开始拖动进度条的时候调用
            public void onStartTrackingTouch(SeekBar seekBar) {
                sb_pause = true;
            }

            @Override
            //停止拖动进度条的时候调用
            public void onStopTrackingTouch(SeekBar seekBar) {
                sb_pause = false;
                mediaPlayer.seekTo(seekBar.getProgress());
                //若此时为暂停状态则继续播放
                if (!mediaPlayer.isPlaying()){
                    mediaPlayer.start();
                    playIv.setImageResource(R.drawable.icon_pause);   //显示为暂停按钮
                }
                String curTime = getCurTime(seekBar.getProgress()); //获取SeekBar当前的数值
                current_tv.setText(curTime);                        //在控件上显示
            }
        });


    }


    /*
     * 点击播放按钮播放音乐，或者暂停从新播放
     * 播放音乐有两种情况：
     * 1.从暂停到播放
     * 2.从停止到播放
     * */
    private void playMusic() {
        /* 播放音乐的函数*/
        if (mediaPlayer!=null&&!mediaPlayer.isPlaying()) {  //mediaPlayer不为空并且不是播放状态
            if (pause_SeekBar == 0) {  //判断是否是暂停，从头开始播放
                try {
                    mediaPlayer.prepare();      //准备
                    mediaPlayer.start();        //播放

                } catch (IOException e) {
                    e.printStackTrace();
                }
            }else{//  从暂停到播放

                mediaPlayer.seekTo(pause_SeekBar); //进度条挪到暂停记录的位置，继续播放
                mediaPlayer.start();
            }
            playIv.setImageResource(R.drawable.icon_pause);   //显示为暂停按钮
        }
    }
    private void pauseMusic() {
        /* 暂停音乐的函数*/
        if (mediaPlayer!=null&&mediaPlayer.isPlaying()) {   //mediaPlayer不为空并且不是播放状态
            pause_SeekBar = mediaPlayer.getCurrentPosition();  //记录暂停的进度条位置  getCurrentPosition得到当前播放位置

            mediaPlayer.pause();        //暂停
            playIv.setImageResource(R.drawable.icon_play); //显示为播放按钮
        }
    }
    private void stopMusic() {
        /* 停止音乐的函数*/
        if (mediaPlayer!=null) {        //判断MediaPlayer是否为空，不为空停止
            mediaPlayer.pause();            //暂停
            pause_SeekBar = 0;              //将记录进度条的位置置0
            mediaPlayer.seekTo(0);  //进度条回到0秒
            mediaPlayer.stop();             //再停止
            playIv.setImageResource(R.drawable.icon_play);    //显示为播放按钮
        }

    }


    @SuppressLint("WrongViewCast")
    private void initView() {
        /* 初始化控件的函数*/
        nextIv = findViewById(R.id.play_next); //下一首
        playIv = findViewById(R.id.play_btn); //播放
        lastIv = findViewById(R.id.play_pre); //上一首
        current_tv = findViewById(R.id.play_current_time);//当前时间
        total_tv = findViewById(R.id.play_duration);//结束时间
        duration_sb = findViewById(R.id.play_seekbar);//进度条
        //音量



        albumIv = findViewById(R.id.play_song_front);//图标
        singerTv = findViewById(R.id.play_song_artist);//歌手
        songTv = findViewById(R.id.play_song_name);     //歌名
        back_btn = findViewById(R.id.play_go_back); //返回
        nextIv.setOnClickListener(this);
        lastIv.setOnClickListener(this);
        playIv.setOnClickListener(this);
        albumIv.setOnClickListener(this);
        back_btn.setOnClickListener(this);
    }


    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.play_pre:         //点击上一首
                Log.i(TAG, "onClick: "+play_position);
                if (play_position ==0) {    //处于第一首状态
                    Toast.makeText(this,"已经是第一首了，开始播放列表最后一首",Toast.LENGTH_SHORT).show();

                    play_position=mDatas.size()-1;  //播放位置=最后一首
                    MusicBean lastBean = mDatas.get(play_position); //根据位置，获取该音乐信息
                    playMusicInMusicBean(lastBean);
                    return;
                }
                //不是第一首状态，播放位置-1，调到上一首
                play_position = play_position-1;
                MusicBean lastBean = mDatas.get(play_position);
                playMusicInMusicBean(lastBean);
                break;
            case R.id.play_next:        //点击下一首
                if (play_position ==mDatas.size()-1) { //处于最后一首状态
                    Toast.makeText(this,"已经是最后一首了，开始播放列表第一首！",Toast.LENGTH_SHORT).show();
                    play_position=0;        //播放位置设到第一首
                    MusicBean nextBean = mDatas.get(play_position);
                    playMusicInMusicBean(nextBean);
                    return;
                }
                //不是最后一首状态，播放位置+1，调到下一首
                play_position = play_position+1;
                MusicBean nextBean = mDatas.get(play_position);
                playMusicInMusicBean(nextBean);
                break;
            case R.id.play_btn:     //播放，暂停
//                if (play_position == -1) {
////                    并没有选中要播放的音乐
//                    Toast.makeText(this,"请选择想要播放的音乐",Toast.LENGTH_SHORT).show();
//                    return;
//                }
                if (mediaPlayer.isPlaying()) {
//                    此时处于播放状态，需要暂停音乐
                    pauseMusic();
                }else {
//                    此时没有播放音乐，点击开始播放音乐
                    playMusic();
                }
                break;
            case R.id.play_go_back:
                finish();   //销毁Activity
                break;
            default:
                break;
        }
    }



    //将毫秒转换为分：秒的形式
    public String getCurTime(int duration){
        String time = "";
        int min = duration/1000/60;
        int sec = duration/1000%60;

        time += min + ":";
        if(sec < 10){
            time += "0";
        }
        time += sec;
        return time;
    }
}